Die zusätzlichen Befehle das HD64180

Helmut Bernhardt

Wer in seinem Cmoputer den Z80 durch einen HD64180 ersetzt hat, wird
sicher schon ein plötzliches Booten oder einen Absturz bei Aufruf von
bestimmten Programmen  bemerkt haben, die vorher mit dem Z80 einwand-
frei zusamnmengearbeitet haben. Zu solchen Programmen zählen REZILOG
unter CP/M oder ZEUS unter NEWDOS/80. Der Fehler liegt nicht am Pro-
zessor sondern am Programm. Der Programmierer hat dort Befehle
benutzt, die von Zilog nicht dokumentiert sind aber trotzdem auf dem
Z80 zur Verfügung stehen. Es sind die die Illegals mit Doppelbyte-Op-
-codes.

Hitachi hat nun andere Vorstellungen entwickelt, wie diese freien Op-
codes verwendet werden können, und eine Reihe dieser Codes den in An-
hang zusammengestellten Befehlen zugeordnet. Gegenüber den Illegals
des Z80 sind das sinnvolle Ergänzungen, die der Architektur des
HD64180 entgegenkommen und u.a. eine elegante Programmierung der in-
ternen Ports der CPU ermöglichen. Die ebenfalls hinzugekommene Multi-
plikation ist leider nur auf 8Bit-Faktoren beschränt geblieben.

Der wichtigste Befehl ist OTIMR, der eine Anzahl von Bytes, die in B
vorgegeben wird, ab einer Adresse im Speicher, auf die HL zeigt, an
aufeinander folgende interne Zeropake-Ports ausgibt, wobei die Adres-
se des ersten Ports in C vortugeben ist. Damit kann z.B. der DMA-Con-
troller schnell mit Parmetern für eine Übertragung versorgt werden.

In mc 1/87, S.74 wurde gezeigt, wie die Illegals durch nrmale Befehle
ersetzt werden können. Danach kann man von Hand entprechende Prgram-
me auf normale  Befehle umstellen. Was der Normalverbraucher zu Fuß
macht, läßt der Experte die CPU zur Laufzeit des Illegal-verseuchten
Programms selbst machen. Eventuell schreibt Gerald dazu nochmal was.

Bei Erreichen eines unbekannten Opcodes wird der höchstpriorisierte
TRAP-Interrupt ausgeführt, der einen CALL 0000H gleichkommt. Er ist
mit einem RESET vergleichbar, nur dass kein richtiges /RESET-Signal er-
folgt, das die gesamte Hardware zurücksetzt. Dadurch wird auch kein
Floppy-Controller in den Einschaltzustand zurückgesetzt und auch kein
ausgeblendetes EPROM wieder eingeschaltet.

Bei 0000H liegt dann ROM vor. Dort kann bei der Initialisierung ein
Sprung auf die TRAP-Service-Routine gepatcht werden. Diese Routine
kann mit dem Stack und den Flags im TRAP-Register herausfinden, ob ein
TRAP die Ursache des Aufrufs war, oder ob die Adresse 0000H durch
Software aufgerufen wurde; bei einem Trap kann sie ermitteln, welches
Byte im Programm  den TRAP auslöste und dem entprechend alternative
normale Befehle abarbeiten, und anschließend wieder die Kontrolle an
das unterbrochene Programm zurückgeben.

Wenn eine solche TRAP-Service-Routine nicht vorliegt, bedeutet der
CALL 0000H einen  Warmstart unter CP/M oder einen Absturz unter
NEWDOS/80, weil die BOOT-Routine im ROM nicht den Floppy-Controller
auf Sinle Density zurücksetzt (deshalb funktioniert beim GENIE auch
der Befehl BOOT oder ein JP 0000H nicht, wenn mit einem Doubler
gearbeitet wird; der TRS 80 decodiert die Adresse 0000H und erzeugt
darus ein /RESET-Signal).

Natürlich funktioniert der TRAP-Interrupt nur bei den Z80-Illegls,
für die der HD64180 keine neuen Befehle eingeführt hat. Wenn ein
illegaler Opcode auftaucht, der einem HD64180-Befehl entpricht, so
wird dieser Befehl nach Hitachi's Vorstellung ordnungsgemäß ausge-
führt.  Der Erfolg ist dann aber nicht der, den sich der Illegal-
-Programmierer einst gedacht hat.

Zusätzliche Befehle des HD64180                           

Multiplikation

ED 4C      MULT  BC    ;BC := B * C          |  17 Taktzyklen
ED 5C      MULT  DE    ;DE ;= D * E          |
ED 6C      MULT  HL    ;HL := H * L          |
ED 7C      MULT  SP    ;SP := SPhigh * SPlow |

Logisches AND zum Setzen der Flags, ohne die Register zu verändern

ED 04      TEST  B     ; A and B             |  7 TaktzyXlen
ED 0C      TEST  C     ; A and C             |
ED 14      TEST  D     ; A and D             |
ED 1C      TEST  E     ; A and E             |
ED 24      TEST  H     ; A and H             |
ED 2C      TEST  L     ; A and L             |
ED 3C      TEST  n     ; A and A             |
ED 34      TE5T  (HL)  ; A and (HL)          |  10 Takt2yklen
ED 64 nn   TEST  nn    ; A and nn            |   9 Taktzyklen
ED 74 pp   TESTIO pp   ; (C) and pp          |  12 Taktzyklen

Zeropage I/O-Befehle

ED 00 pp    IN0  B, {pp)    ; B := (pp)      |  12 Taktzyklen
ED 08 pp    IN0  C, (pp)    ; C := (pp)      |
ED 10 pp    IN0  D, (pp)    ; D := (pp)      |  
ED 18 pp    IN0  E, (pp)    ; E := (pp)      |
ED 20 pp    IN0  H, (pp)    ; H := (pp)      |
ED 28 pp    IN0  L, (pp)    ; L := (pp)      |
ED 30 pp    IN0  F, (pp)    ; S,Z,P <- (pp)  |
ED 38 pp    IN0  A, (pp)    ; A := (pp)      |

ED 01 pp    OUT0 (pp),B     ; (pp) := B      |  13 TaXt2yklen
ED 09 pp    OUT0 (pp),C     ; (pp) := C      |
ED 11 pp    OUT0 (pp),D     ; (pp) := D      |
ED 19 pp    OUT0 (pp),E     ; (pp) := E      |
ED 21 pp    OUT0 (pp),H     ; (pp) := H      |
ED 29 pp    OUT0 (pp),L     ; (pp) := L      | 
ED 39 pp    OUT0 (pp),A     ; (pp} := A      |

ED 83       OTIM     ; (C) := (HL), HL:= HL+1, C := C+1, B := B-1
						14 Taktzyklen
ED 93       OTIMR    ; (C)..(C+B) := (HL)..(HL+B), B:=0
                     ; oder: (C):=(HL), C:=C+1, HL:=HL+1, B:BB-1
                     ; wiederhole bis B=0	B*16 Taktzyklen
ED 8B       OTDM     ; (C):=(HL), HL:=HL-1, C;=C-1, B:=B-1
						14 Taktzyklen
ED 9B       OTDMR    ; (C)..(C-B) := (H).. (HL-B),  B:=0
                     ; oder: (C):=(HL), C:=C-1, HL:=HL-1, B:=B-1
						B*16 Taktzyklen

ED 76       SLP      ; Sleep: Einstellen aller Aktivitäten incl.
                     ; Refresh, bis /RESET oder /IMT eintritt